package dynamicproxy.jdk;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author liangbaigao
 * @Date 2023/9/29 22:44
 */
public class JdkProxy {

    private Object target;

    public JdkProxy(Object target) {
        this.target = target;
    }

    public Object getJdkProxy() {

        //target.getClass().getClassLoader(), //目标类使用的类加载器
        //target.getClass().getInterfaces(), //目标对象实现的接口类型
        //new InvocationHandler(){ //事件处理器

        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {

                    /**
                     * invoke方法参数说明
                     * @param proxy 代理对象
                     * @param method 对应于在代理对象上调用的接口方法Method实例
                     * @param args 代理对象调用接口方法时传递的实际参数
                     * @return: java.lang.Object 返回目标对象方法的返回值,没有返回值就返回null
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代理开始了，正在调用中");
                        method.invoke(target, args);
                        System.out.println("代理调用完成");
                        // 没有返回值
                        return null;
                    }
                });
                }
    }
